// HTMLParser Library $Name: v1_6 $ - A java-based parser for HTML
// http://sourceforge.org/projects/htmlparser
// Copyright (C) 2004 Derrick Oswald
//
// Revision Control Information
//
// $Source: /cvsroot/htmlparser/htmlparser/src/org/htmlparser/http/HttpHeader.java,v $
// $Author: derrickoswald $
// $Date: 2006/06/02 01:48:43 $
// $Revision: 1.2 $
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//

package org.htmlparser.http;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * Utility methods to display HTTP headers.
 */
public class HttpHeader {

	/**
	 * Private constructor. This class is completely static.
	 */
	private HttpHeader() {
	}

	/**
	 * Gets the request header for the connection.
	 * <em>This header is generated from the contents of the connection
	 * and may not be exactly the same as the request that will be sent.</em>
	 * 
	 * @param connection
	 *            The connection to convert into an HTTP request header.
	 * @return The string that would be sent by the HTTP request.
	 */
	public static String getRequestHeader(HttpURLConnection connection) {
		// dump it
		StringBuffer buffer;
		Map map;
		String key;
		List items;

		buffer = new StringBuffer(1024);
		buffer.append(connection.getRequestMethod());
		buffer.append(" ");
		buffer.append(connection.getURL());
		buffer.append(" HTTP/1.1\n");
		map = connection.getRequestProperties();
		for (Iterator iter = map.keySet().iterator(); iter.hasNext();) {
			key = (String) iter.next();
			items = (List) map.get(key);
			buffer.append(key);
			buffer.append(": ");
			for (int i = 0; i < items.size(); i++) {
				if (0 != i)
					buffer.append(", ");
				buffer.append(items.get(i));
			}
			buffer.append("\n");
		}

		return (buffer.toString());
	}

	/**
	 * Gets the response header for the connection. Calling this method on an
	 * un-connected connection will generate an error, as will an attempt to get
	 * information from a connected but invalid connection.
	 * <em>This header is generated from the contents of the connection
	 * and may not be exactly the same as the response that was received.</em>
	 * 
	 * @param conn
	 *            The connection to convert into an HTTP response header.
	 * @return The string that was sent as the HTTP response.
	 */
	public static String getResponseHeader(HttpURLConnection conn) {
		// dump it
		StringBuffer buffer;
		int code;
		String message;
		String key;
		String value;

		buffer = new StringBuffer(1024);
		try {
			code = conn.getResponseCode();
			if (-1 != code) {
				message = conn.getResponseMessage();
				for (int i = 0; null != (value = conn.getHeaderField(i)); i++) {
					key = conn.getHeaderFieldKey(i);
					if ((null == key) && (0 == i)) {
						buffer.append("HTTP/1.1 ");
						buffer.append(code);
						buffer.append(" ");
						buffer.append(message);
						buffer.append("\n");
					} else {
						if (null != key) {
							buffer.append(key);
							buffer.append(": ");
						}
						buffer.append(value);
						buffer.append("\n");
					}
				}
			}
		} catch (IOException ioe) {
			buffer.append(ioe.toString());
		}

		return (buffer.toString());
	}
}
